#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <thread>

#define NUM 10
// void *run(void *args)
// {
//     while (true)
//     {
//         std::cout << "new thread, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return nullptr;
// }

// int main()
// {
//     std::cout << "我是一个进程" << getpid() << std::endl;
//     pthread_t tid;
//     pthread_create(&tid, nullptr, run, (void *)"thread-1");
//     while (true)
//     {
//         std::cout << "main thread, pid: " << getpid() << std::endl;
//         sleep(1);
//     }

//     return 0;
// }
std::string toHex(pthread_t id)
{
    char buffer[64];
    snprintf(buffer, sizeof(buffer), "0x%lx", id);
    return buffer;
}
class Pthread
{
public:
    Pthread()
    {
    }
    void Init(const std::string &name, int a, int b)
    {
        _name = name;
        _a = a;
        _b = b;
    }
    ~Pthread()
    {
    }
    std::string Name()
    {
        return _name;
    }
    void Exctue()
    {
        _result = _a + _b;
    }
    int Result()
    {
        return _result;
    }
    int A()
    {
        return _a;
    }
    int B()
    {
        return _b;
    }
    void Setid(pthread_t tid)
    {
        _tid = tid;
    }
    pthread_t Tid()
    {
        return _tid;
    }

private:
    std::string _name;
    int _a;
    int _b;
    int _result;
    pthread_t _tid;
};

// int *add = nullptr;
// void *start1(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     int count = 0;
//     add = &count;
//     while (true)
//     {
//         std::cout << name << ":" << count << std::endl;
//         sleep(1);
//     }
// }
// void *start2(void *args)
// {
//     std::string name = static_cast<const char *>(args);
//     while (true)
//     {
//         std::cout << name << ":" << *add << std::endl;
//         (*add)++;
//         sleep(1);
//     }
// }

void *start(void *args)
{

    pthread_detach(pthread_self());
    std::string name = static_cast<const char *>(args);
    while (true)
    {

        std::cout << "i am new thread" << std::endl;
        sleep(1);
    }
}

int main()
{
    // pthread_t td1, td2;
    //  pthread_create(&td1, nullptr, start1, (void *)"thread-1");
    //  pthread_create(&td2, nullptr, start2, (void *)"thread-2");

    // pthread_join(td1, nullptr);
    // pthread_join(td2, nullptr);
    pthread_t td;
    pthread_create(&td, nullptr, start, (void *)"thread-1");
    pthread_detach(td);
    sleep(5);
    // int n = pthread_cancel(td);
    std::cout << "取消线程" << std::endl;
    sleep(5);

    void *ret = nullptr;
    int n = pthread_join(td, &ret);
    std::cout << "new thread exit" << (long long int)ret << std::endl;
}

// void *run(void *args)
// {
//     Pthread *td = static_cast<Pthread *>(args);
//     while (1)
//     {
//         std::cout << "我是新线程我的名字是:" << td->Name() << "my tid is:" << td->Tid() << std::endl;
//         td->Exctue();
//         sleep(1);
//         break;
//     }

//     return td;
// }

// int main()
// {
//     Pthread td[NUM];
//     for (int i = 0; i < NUM; i++)
//     {
//         char id[60];
//         snprintf(id, sizeof(id), "thread-i:%d:", i);
//         td[i].Init(id, i * 10, i * 20);
//     }

//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_t id;
//         pthread_create(&id, nullptr, run, &td[i]);
//         td[i].Setid(id);
//     }

//     for (int i = 0; i < NUM; i++)
//     {
//         pthread_join(td[i].Tid(), nullptr);
//     }
//     for (int i = 0; i < NUM; i++)
//     {
//         printf("td[%d]: %d+%d=%d[%ld]\n", i, td[i].A(), td[i].B(), td[i].Result(), td[i].Tid());
//     }
// }

// void *run(void *args)
// {
//     Pthread *td = static_cast<Pthread *>(args);
//     while (1)
//     {
//         std::cout << "我的名字是:" << td->Name() << std::endl;
//         std::cout << "task result is:" << td->Exctue() << std::endl;
//         sleep(1);
//         break;
//     }

//     return (void *)10;
// }
// int main()
// {
//     pthread_t td;
//     Pthread *td1 = new Pthread("thread-1", 10, 20);
//     pthread_create(&td, nullptr, run, td1);
//     void *ret = nullptr;
//     int n = pthread_join(td, &ret);
//     if (n != 0)
//     {
//         std::cerr << "join error" << strerror(n) << std::endl;
//         return 1;
//     }
//     std::cout << "join sucess" << (long long int)ret << std::endl;
//     return 0;
// }